﻿using System.Collections.Generic;
using System.Diagnostics.Contracts;
using System.Linq;
using IMModel.Domain.Common;

namespace IMModel.Domain
{
    /// <summary>
    /// Раздел в периоде
    /// </summary>
    partial class SectionTerm : ICacheble, IRespondentIndexVector, IItem
    {
        #region ICacheble Members
        //private RespondentIndexCollection _respondentIndexCache;
        private Dictionary<IndexContext, RespondentIndexCollection> _respondentIndexCaches;

        public void Invalidate()
        {
            Contract.Ensures(_respondentIndexCaches == null);
            Contract.Ensures(_totalWeight == null);
            Contract.Ensures(_categoryTotalWeight == null);

            _respondentIndexCaches = null;
            _totalWeight = null;
            _categoryTotalWeight = null;

            ParticipateSections.Invalidate();
            CategorySectionTerms.Invalidate();
        }

        #endregion

        #region IRespondentIndexVector Members

        /// <summary>
        /// Получает вектор индексов респондентов
        /// </summary>
        public RespondentIndexCollection Indexes
        {
            get
            {
                return CalcIndexes(IndexContext.Current);
                //return _respondentIndexCache;
            }
        }

        //private void CalcIndexes()
        //{
        //    if (_respondentIndexCache != null) return;

        //    // Получить индексы (рекурсивно) всех подразделов
        //    _respondentIndexCache = ParticipateSections.GetIndexes(IndexContext.Current, x => x.GetNormalizedWeight());

        //    // Получить индексы по категориям
        //    _respondentIndexCache += CategorySectionTerms.GetIndexes(x => x.GetNormalizedWeight());
        //}
        #endregion

        /// <summary>
        /// выборка по ??? и расчёт индексов в соответствие с выбранной политикой
        /// </summary>
        public RespondentIndexCollection CalcIndexes(IndexContext сontext)
        {
            return CCache.Get(ref _respondentIndexCaches, сontext, () =>
            {
                // Получить индексы (рекурсивно) всех подразделов
                var ric = ParticipateSections.GetIndexes(сontext, x => x.GetNormalizedWeight());
                // Получить индексы по категориям
                ric += CategorySectionTerms.GetIndexes(сontext, x => x.GetNormalizedWeight());
                return ric;
            });
        }
    }
}